/*
 * 日期格式化
 *  date: 日期
 *  format: 日期格式
 */

let dateUtil = {};

dateUtil.formatDate = function (date, format) {
    if (!date || date == '') {
        return '';
    }
    date = new Date(date);
    var o = {
        // 月份
        'M+': date.getMonth() + 1,
        // 日
        'd+': date.getDate(),
        // 小时
        'h+': date.getHours(),
        // 分
        'm+': date.getMinutes(),
        // 秒
        's+': date.getSeconds(),
        // 季度
        'q+': Math.floor((date.getMonth() + 3) / 3),
        // 毫秒
        'S': date.getMilliseconds()
    };
    if (/(y+)/.test(format))
        format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp('(' + k + ')').test(format))
            format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
    return format;
};

/**
 * 获取当天
 */
dateUtil.getCurrentDate = function () {
    return dateUtil.formatDate(new Date(), 'yyyy-MM-dd');
};

/**
 * 获取当月
 * @returns {string|*}
 */
dateUtil.getCurrentMonth = function () {
    return dateUtil.formatDate(new Date(), 'yyyy-MM');
};

/**
 * 获取当年
 * @returns {string|*}
 */
dateUtil.getCurrentYear = function () {
    return dateUtil.formatDate(new Date(), 'yyyy');
};

/**
 * 获取当天是周几
 * @returns {number} 周几。1-7
 */
dateUtil.getCurrentWeek = function () {
    // 获取星期几,getDay()返回值是 0（周日） 到 6（周六） 之间的一个整数。0||7为7，即weekday的值为1-7
    return new Date().getDay() || 7;
};

/**
 * 获取上月
 * @returns {string|*}
 */
dateUtil.getPreMonth = function (date) {
    let currentMonth = dateUtil.formatDate(date, 'yyyy-MM');
    let year = currentMonth.substr(0, 4);
    let month = currentMonth.substr(5, 2);
    let preMonth;
    if (month.indexOf('0') == 0) {
        preMonth = Number(month.substr(1, 1)) - 1;
    } else {
        preMonth = Number(month) - 1;
    }
    if (preMonth < 1) {
        year--;
        preMonth = 12;
    } else if (preMonth < 10) {
        preMonth = '0' + preMonth;
    }
    return year + '-' + preMonth;
};

/**
 * 获取下月
 * @returns {string|*}
 */
dateUtil.getNextMonth = function (date) {
    let currentMonth = dateUtil.formatDate(date, 'yyyy-MM');
    let year = currentMonth.substr(0, 4);
    let month = currentMonth.substr(5, 2);
    let nextMonth;
    if (month.indexOf('0') == 0) {
        nextMonth = Number(month.substr(1, 1)) + 1;
    } else {
        nextMonth = Number(month) + 1;
    }
    if (nextMonth > 12) {
        year++;
        nextMonth = '01';
    } else if (nextMonth < 10) {
        nextMonth = '0' + nextMonth;
    }
    return year + '-' + nextMonth;
};

/**
 * 获取指定日期是周几
 * @param date 传入指定日期
 * @returns {number} 周几。1-7
 */
dateUtil.getWeekByDate = function (date) {
    // 获取星期几,getDay()返回值是 0（周日） 到 6（周六） 之间的一个整数。0||7为7，即weekday的值为1-7
    return date.getDay() || 7;
};

/**
 * 获取明天
 * @returns {string|*}
 */
dateUtil.getTomorrow = function () {
    var date = new Date();
    date.setDate(date.getDate() + 1);
    return dateUtil.formatDate(date, 'yyyy-MM-dd');
};

/**
 * 获取后天
 * @returns {string|*}
 */
dateUtil.getAfterTomorrow = function () {
    var date = new Date();
    date.setDate(date.getDate() + 2);
    return dateUtil.formatDate(date, 'yyyy-MM-dd');
};

/**
 * 获取昨天
 */
dateUtil.getYesterday = function () {
    var date = new Date();
    date.setDate(date.getDate() - 1);
    return dateUtil.formatDate(date, 'yyyy-MM-dd');
};

/**
 * 获取本周开始、结束日期
 * @returns {*[]}
 */
dateUtil.getThisWeek = function () {
    var date = new Date();
    var weekStartDate = new Date(date.getFullYear(), date.getMonth(), date.getDate() - date.getDay() + 1);
    var weekEndDate = new Date(date.getFullYear(), date.getMonth(), date.getDate() - date.getDay() + 7);
    return [dateUtil.formatDate(weekStartDate, 'yyyy-MM-dd'), dateUtil.formatDate(weekEndDate, 'yyyy-MM-dd')];
};

/**
 * 获得某月的天数
 * @param month
 * @returns {number}
 */
dateUtil.getMonthDays = function (month) {
    var date = new Date();
    var monthStartDate = new Date(date.getFullYear(), date.getMonth(), 1);
    var monthEndDate = new Date(date.getFullYear(), date.getMonth() + 1, 1);
    var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24);
    return days;
}

/*
 *  某周的第一天
 *  date: 日期
 */
dateUtil.getFirstDayOfWeek = function (date) {
    // 获取星期几,getDay()返回值是 0（周日） 到 6（周六） 之间的一个整数。0||7为7，即weekday的值为1-7
    var weekday = date.getDay() || 7;
    // 往前算（weekday-1）天，年份、月份会自动变化
    date.setDate(date.getDate() - weekday + 1);
    return dateUtil.formatDate(date, 'yyyy-MM-dd');
}

/*
 *  某周的最后一天
 *  date: 日期
 */
dateUtil.getLastDayOfWeek = function (date) {
    // 获取星期几,getDay()返回值是 0（周日） 到 6（周六） 之间的一个整数。0||7为7，即weekday的值为1-7
    var weekday = date.getDay() || 7;
    // 往前算（weekday-1）天，年份、月份会自动变化
    date.setDate(date.getDate() - weekday + 7);
    return dateUtil.formatDate(date, 'yyyy-MM-dd');
}

/*
 *  某月的第一天
 *  date: 日期
 */
dateUtil.getFirstDayOfMonth = function (date) {
    date.setDate(1);
    return dateUtil.formatDate(date, 'yyyy-MM-dd');
}

/*
 *  某月的最后一天
 *  date: 日期
 */
dateUtil.getCurrentMonthLast = function (date) {
    var currentMonth = date.getMonth();
    var nextMonth = ++currentMonth;
    var nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1);
    var oneDay = 1000 * 60 * 60 * 24;
    return dateUtil.formatDate(new Date(nextMonthFirstDay - oneDay), 'yyyy-MM-dd');
}

/*
 *  日期相减，获取相减后的日期
 *  date: 日期
 *  days: 相减天数
 */
dateUtil.getDateMinus = function (date, days) {
    var time = date.getTime() - 1000 * 60 * 60 * 24 * days;
    return dateUtil.formatDate(new Date(time), 'yyyy-MM-dd');
}

/**
 * 获取当天日期 yyyy-MM-dd 格式
 * @returns {*}
 */
dateUtil.getNowDate = function () {
    return dateUtil.formatDate(new Date(), 'yyyy-MM-dd');
}

/**
 * 获取本月开始、结束日期
 * @returns {*[]}
 */
dateUtil.getThisMonth = function () {
    var date = new Date();
    var monthStartDate = new Date(date.getFullYear(), date.getMonth(), 1);
    var monthEndDate = new Date(date.getFullYear(), date.getMonth(), dateUtil.getMonthDays(date.getMonth()));
    return [dateUtil.formatDate(monthStartDate, 'yyyy-MM-dd'), dateUtil.formatDate(monthEndDate, 'yyyy-MM-dd')];
};

/**
 * 获得本季度的开始月份
 * @returns {number}
 */
dateUtil.getQuarterStartMonth = function () {
    var nowMonth = new Date().getMonth();
    var quarterStartMonth = 0;
    if (nowMonth < 3) {
        quarterStartMonth = 0;
    }
    if (2 < nowMonth && nowMonth < 6) {
        quarterStartMonth = 3;
    }
    if (5 < nowMonth && nowMonth < 9) {
        quarterStartMonth = 6;
    }
    if (nowMonth > 8) {
        quarterStartMonth = 9;
    }
    return quarterStartMonth;
}

/**
 * 获取本季度开始、结束日期
 * @returns {*[]}
 */
dateUtil.getThisSeason = function () {
    var date = new Date();
    var quarterStartDate = new Date(date.getFullYear(), dateUtil.getQuarterStartMonth(), 1);
    var quarterEndMonth = dateUtil.getQuarterStartMonth() + 2;
    var quarterEndDate = new Date(date.getFullYear(), quarterEndMonth, dateUtil.getMonthDays(quarterEndMonth));
    return [dateUtil.formatDate(quarterStartDate, 'yyyy-MM-dd'), dateUtil.formatDate(quarterEndDate, 'yyyy-MM-dd')];
};

/**
 * 获取本年开始、结束日期
 * @returns {*[]}
 */
dateUtil.getThisYear = function () {
    var date = new Date();
    return [date.getFullYear() + "-01-01", date.getFullYear() + "-12-31"];
};

/**
 * 获取去年开始、结束日期
 * @returns {*[]}
 */
dateUtil.getLastYear = function () {
    var date = new Date();
    return [(date.getFullYear() - 1) + "-01-01", (date.getFullYear() - 1) + "-12-31"];
};

/**
 * 字符串转日期
 * @param dateStr "2010-08-01"
 */
dateUtil.parseDate = function (dateStr) {
    // 转换日期格式
    dateStr = dateStr.replace(new RegExp("/","g"), "-"); // "2010/08/01";
    // 创建日期对象
    return new Date(dateStr);
};

/**
 * 指定日期增加天数
 * @param dateStr
 * @param days
 * @returns {Date}
 */
dateUtil.getDateAddDays = function (dateStr, days) {
    // 转换日期格式
    dateStr = dateStr.replace(new RegExp("/","g"), "-"); // "2010/08/01";
    // 创建日期对象
    var date = new Date(dateStr);
    date.setDate(date.getDate() + days);
    return date;
};

/**
 * 指定日期增加天数(yyyy-MM-dd)
 * @param dateStr
 * @param days
 * @returns {string|*}
 */
dateUtil.getDateStrAddDays = function (dateStr, days) {
    // 转换日期格式
    dateStr = dateStr.replace(new RegExp("/","g"), "-"); // "2010/08/01";
    // 创建日期对象
    var date = new Date(dateStr);
    date.setDate(date.getDate() + days);
    return dateUtil.formatDate(date, 'yyyy-MM-dd');
};

/**
 * 计算指定时间与当前时间差，分钟
 * @param date
 */
dateUtil.getIntevalMinutes = function (date) {
    let dateBegin = dateUtil.parseDate(date);
    let dateEnd = new Date();
    let diff = dateEnd.getTime() - dateBegin.getTime();//时间差的毫秒数
    return Math.ceil(diff / 1000 / 60);
};

/**
 * 比较日期大小
 * @param date1
 * @param date2
 */
dateUtil.isBeyondDate = function (date1, date2) {
    return new Date(date1).getTime() > new Date(date2).getTime();
};


export default dateUtil;
